#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int show_bmp(char *bmpname)
{
    //1.打开液晶屏文件
    int lcdfd = open("/dev/fb0",O_RDWR);
    if(lcdfd == -1)
    {
        printf("打开液晶屏失败\n");
        return 0;
    }
    //2.打开bmp图片文件
    int bmpfd = open(bmpname,O_RDWR);
    if(bmpfd == -1)
    {
        printf("打开图片失败\n");
        return 0;
    }
    //内存映射   
    char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);

    //3.读取bmp图片的数据
    char buf[800*480*3]={0};//800*480:图片像素点总数 *3：C的代码单位是字节
    //跳过表示图片信息的54个字节
    read(bmpfd,buf,54);
    read(bmpfd,buf,800*480*3);
    //添加一个字节
    char bmp[800*480*4]={0};//每个像素点加入一个字节所以大小变成*4
    for(int i=0,j=0;i<800*480*3;i+=3,j+=4)//i+=3:表示每隔RGB加入一个字节,j+=4:表示跳过ARGB
    {
        bmp[j]=buf[i];
        bmp[j+1]=buf[i+1];
        bmp[j+2]=buf[i+2];
        bmp[j+3]=0;
    }

    //4.将读取出来的图片数据写入到液晶屏上
    for(int i=0;i<800*480*4;i++)
    {
       p[i]=bmp[i];
    }
    // write(lcdfd, bmp, 800*480*4);
    //5.关闭液晶屏文件、bmp图片文件
    close(lcdfd);
    close(bmpfd);
    return 0;
}

int main()
{
    // while (1) {
    //     // for (int i = 0; i < 100000000000; i++) {
    //     //     show_bmp("1.bmp");
    //     // }
    //     // for (int i = 0; i < 100000000000; i++) {
    //     //     show_bmp("2.bmp");
    //     // }
    //     // for (int i = 0; i < 1000000000000; i++) {
    //         show_bmp("3.bmp");
    //     // }
    //     // for (int i = 0; i < 1000000000000; i++) {
    //         show_bmp("4.bmp");
    //     // }
    // }
    while (1) {
        show_bmp("1.bmp");
        for (int i = 0; i < 1000000000; i++) {
        }
        show_bmp("2.bmp");
        for (int i = 0; i < 1000000000; i++) {   
        }
        show_bmp("3.bmp");
        for (int i = 0; i < 1000000000; i++) {
        }
        show_bmp("4.bmp");
        for (int i = 0; i < 1000000000; i++) {   
        }
    }
    // show_bmp("1.bmp");
    //内存映射   
    // char *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcdfd,0);
    // pic_circular_spread("1.bmp");
}